use serde::{Deserialize, Serialize, Serializer};

/// 发送请求数据基础结构
#[derive(Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ReqDto {
    pub msg_id: String,
    // 主机唯一id
    pub host_id: String,
    // 主机ip
    pub host_ip: String,
    pub code: u32,
    // 请求的数据结构dto转换成json string
    #[serde(serialize_with = "plain_string")]
    #[serde(skip_serializing_if = "String::is_empty")]
    pub data: String,
    /// 请求时间戳
    pub ts: u64,
}

fn plain_string<S>(str: &String, ser: S) -> Result<S::Ok, S::Error> where S: Serializer {
    ser.serialize_str(str)
}

/// 返回结果基础结构
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ResDto {
    // 这个msgId没有业务意义，只用于校验server发送的消息唯一性
    pub msg_id: String,
    pub msg: String,
    /// http state code 或 服务端的错误码
    pub code: u32,
    /// 接收后需要转换为具体的task
    pub data: String,
}

/// 业务数据结构
#[derive(Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct BizDto {
    /// 这个是业务需要用到msgId，从后台管理来的，回去的时候再带上
    pub msg_id: String,
    /// 具体的业务code，每一个code对应一个task
    pub biz_code: u32,
    pub level: u8,
    pub order: u32,
    /// 业务数据结构dto转换成的json string
    pub data: String,
}